package com.gws.ievent.scheduler;

import com.gws.ievent.common.enums.EventTimeTypeEnum;
import com.gws.ievent.common.utils.CronUtil;
import com.gws.ievent.common.utils.DateTimeUtil;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 事件任务
 * @author song
 * @date 2022/10/17 22:35
 */
@Data
public class Scheduler {

    /**
     * 事件ID
     */
    private Long id;

    /**
     * 事件名称
     */
    private String name;

    /**
     * 时间类型: 1周期时间/2固定时间
     */
    private Integer timeType;

    /**
     * 周期时间
     * cron表达式 6位, 没有年
     * 秒 分 时 日 月 周
     *
     * 定时时间
     * 指定某个时间点
     * yyyy-MM-dd HH:mm:ss
     */
    private String time;


    /**
     * 取消事件
     */
    private boolean cancel;


    /**
     * 任务
     */
    private IJob job;


    /**
     * 下一个周期时间
     *
     * @return
     */
    public LocalDateTime next() {
        LocalDateTime next = null;
        if (this.getTimeType().equals(EventTimeTypeEnum.CYCLE.getValue())) {
            next = CronUtil.next(this.getTime());
        } else if (this.getTimeType().equals(EventTimeTypeEnum.FIXED.getValue())) {
            next = DateTimeUtil.format(this.getTime(), DateTimeUtil.yyyy_MM_dd_HH_mm_ss);
        }

        return next;
    }


    /**
     * 下一个延时时间
     *
     * @return
     */
    public Long delay() {
        LocalDateTime next = this.next();
        if (next == null) {
            return null;
        }

        return DateTimeUtil.toMillisecond(next) - System.currentTimeMillis();
    }

}
